package com.monodaipoly2.view;


import com.monodaipoly2.persistencia.Rol;
import com.monodaipoly2.persistencia.Usuario;
import java.io.Serializable;
import org.springframework.context.annotation.Scope;
import com.monodaipoly2.servicio.UsuarioServicio;
import com.monodaipoly2.view.utils.MessageProvider;
import java.util.Collection;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.stereotype.Controller;
import org.springframework.webflow.execution.RequestContext;


@Controller("usuarioControlador")
@Scope("request")
public class UsuarioControlador implements Serializable{

    private UsuarioServicio usuarioServicio;
    Usuario usuario;
    private Collection<Usuario> usuarios;
    Rol rol;
    private Collection<Rol> roles;

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

     public Rol getRol() {
        return rol;
    }

    public void setRol(Rol rol) {
        this.rol = rol;
    }



    @PostConstruct
    private void iniciarUsuario(){
        usuario=new Usuario();
    }

    @Required
    @Autowired
    public void setUsuarioServicio(UsuarioServicio usuarioServicio) {
        this.usuarioServicio = usuarioServicio;
    }

     public Collection<Usuario> getUsuarios() {
        return this.usuarioServicio.getAll();
    }

    public void setUsuarios(Collection<Usuario> usuarios) {
        this.usuarios = usuarios;
    }


    public String comprobarDisponibilidadNick() {
        String dispo="no";
        FacesMessage msg = null;

        if(usuarioServicio.buscar(usuario.getNick())!=null){
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, MessageProvider.getValue("nick_no_dispo"), MessageProvider.getValue("nick_no_dispo"));
        }else{
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, MessageProvider.getValue("nick_dispo"), MessageProvider.getValue("nick_dispo"));
            dispo="si";
        }


        FacesContext.getCurrentInstance().addMessage(null, msg);
        return dispo;

    }





    public String crearUsuario() {

        String correcto="si";
        FacesMessage msg = null;

        System.out.println("comprobarDispo desde crearUsuario  "+ usuario.getContrasena());
        if(!usuario.getNick().trim().isEmpty() && usuario.getContrasena()!=null && !usuario.getContrasena().trim().isEmpty() && this.comprobarDisponibilidadNick().compareTo("si")==0){
            this.usuarioServicio.crear(usuario);
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, MessageProvider.getValue("creacion"), MessageProvider.getValue("nick_creado"));

        }else{
            correcto="no";
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, MessageProvider.getValue("creacion"), MessageProvider.getValue("nick_no_creado"));
            System.out.println("Error al crear usuario");
        }

        FacesContext.getCurrentInstance().addMessage(null, msg);

        return correcto;



    }

    public void borrarUsuario(){
       FacesMessage msg = null;
        try {
            if (usuario != null && usuario.getNick() != null) {
                System.out.println("usuario nick:  "+usuario.getNick());
                usuario.setRoles(null);
                usuarioServicio.borrarPorClave(usuario.getNick());

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, MessageProvider.getValue("correcto"), MessageProvider.getValue("correcto"));


            }

        } catch (Exception ex) {
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, MessageProvider.getValue("error"), MessageProvider.getValue("error_borrando"));

        }
       FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public void hacerAdmin(){
        FacesMessage msg = null;
        if(this.isAdmin(usuario)!=true){
            usuario.getRoles().add(usuarioServicio.buscarRol("ROLE_ADMIN").getId());
            usuario.setAdministrador(true);
            usuarioServicio.actualizar(usuario);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, MessageProvider.getValue("correcto"), MessageProvider.getValue("si_admin"));
        }else{
        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, MessageProvider.getValue("error"), MessageProvider.getValue("no_admin"));
        }
        FacesContext.getCurrentInstance().addMessage(null, msg);

    }

    public void deshacerAdmin(){
        FacesMessage msg = null;
        if(this.isAdmin(usuario)!=false){
            usuario.getRoles().remove(usuarioServicio.buscarRol("ROLE_ADMIN").getId());
            usuario.setAdministrador(false);
            usuarioServicio.actualizar(usuario);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, MessageProvider.getValue("correcto"), MessageProvider.getValue("no_admin"));
        }else{
        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, MessageProvider.getValue("error"), MessageProvider.getValue("si_admin"));
        }
        FacesContext.getCurrentInstance().addMessage(null, msg);

    }


    public boolean isAdmin(Usuario usuario){
        return usuario.getRoles().contains(usuarioServicio.buscarRol("ROLE_ADMIN").getId());
    }

}
